package sim_moteur.element.vegetal;

import sim_moteur.element.Chose;
import sim_moteur.element.Vivant;
import sim_moteur.element.animeaux.Animal;

public class Vegetal extends Vivant {

	private static final int ENDURANCE = 5;
	public final static float VIE_MATURE = 8;
	public final static float VIE_MAX = 10;
	public final static float VIE_DEPART = 1;
	public final static float INCREMENT_VIE = 0.6f;
	public final static float POURCENTAGE_DIGESTIBLE = 0.3f;
	public final static float SEUIL_DE_REPRODUCTION = 0.2f;

	public final static int NOMBRE_MAX_REPRODUCTION = 3;

	public final static String NOM_GENERIC = "Plante";

	private int nbReproduction;
	private int anneeMature = 0;

	public Vegetal(String name, float vitalite) {
		super(name, vitalite);
		nbReproduction = 0;
	}

	public Vegetal(String name) {
		this(name, VIE_DEPART);
	}

	/**
	 * {@inheritDoc} La plante accepte de recevoir un vivant dans le même espace
	 * qu'elle. Le vivant peut manger la plante
	 */
	public boolean recoit(Chose item) {
		boolean retVal = false;
		if (item instanceof Animal) {
			retVal = true;
		}
		return retVal;
	}

	/**
	 * {@inheritDoc} La plante croit jusqu'à sa taille maximale.
	 */
	public boolean vit(long step) {

		boolean toujoursVivant = true;
		// La plante grandit
		if (vie < VIE_MAX) {
			vie += INCREMENT_VIE;
			action = Action.NOUVEAU;

		} else // la plante risque de mourir de vieillesse
		{
			// plus elle vieillit plus elle risque de mourir.
			anneeMature++;
			if (Math.random() * ENDURANCE < anneeMature) {
				vie = 0;
				action = Action.MOURIR;
				etat = Etat.MORT;
				anneeMature = 0;
				toujoursVivant = false;
			}
		}
		if(toujoursVivant){
			// la plante peut de se reproduire si elle est assez vivante
			if (vie > VIE_MATURE) {
				etat = Etat.PLANTE_MATURE;

				if (reproduit()) {
					action = Action.VEGETAL_REPRODUIRE;
				} else {
					action = Action.VEGETAL_NORMAL;
				}
			}
		}
		return toujoursVivant;
	}

	/**
	 * Reproduit la plante selon une certaine probabilité.
	 * 
	 * @return vrai si la plante se reproduit
	 */
	public boolean reproduit() {
		// Il y a une certaine probabilité de reproduction
		boolean faitEnfant = (Math.random() + SEUIL_DE_REPRODUCTION) > 1;

		if (faitEnfant)
			if (nbReproduction < NOMBRE_MAX_REPRODUCTION) {
				nbReproduction++;
			}

		return faitEnfant;
	}

	@Override
	public String toString() {
		return super.toString() + "annee de maturité:" + anneeMature + "\n"
				+ "reproductions: " + nbReproduction + "\n";
	}

}
